package com.itcz.maker.meta;

import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.json.JSONUtil;

public class MetaManager {

    // volatile关键字含义表示内存可见性
    // （不然每个线程都会在自己的本地内存空间更新一个Mate对象数据，会导致多个线程重复初始化Mate对象）
    private static volatile Meta meta;

    // 私有构造函数，防止外部实例化
    private MetaManager() {

    }

    // 获取Meta对象（双检索单例模式）
    public static Meta getMetaObject() {
        // 第一个判空防止mate不为空时，多个线程也去抢占锁（提高效率）
        if(meta == null) {
            // 对整个类加锁，防止当mate为空时，多个线程同时初始化Mate对象（提高效率）
            synchronized (MetaManager.class) {
                // 多个线程都经过第一个判空后并抢占锁，同时有一个线程已经拿到锁并初始化Mate对象后，第二个判空防止其他线程拿到锁后又初始化Mate对象，
                // 这会导致加锁操作无效（提高效率）
                if(meta == null) {
                    meta = initMateObject();
                }
            }
        }
        return meta;
    }


    public static Meta initMateObject() {
        // 利用Hutool工具包处理json转bean操作
//        String mateJson = ResourceUtil.readUtf8Str("meta.json");
//        String mateJson = ResourceUtil.readUtf8Str("springboot-init-meta.json");
        String mateJson = ResourceUtil.readUtf8Str("template.json");
        Meta newMeta = JSONUtil.toBean(mateJson, Meta.class);
        // 校验mate对象
        MetaValidator.doValidWithFill(newMeta);
        return newMeta;
    }
}
